#pragma once

#include "../../element_manager.h"
#include "../group.h"
#include "../group_define.h"

namespace burn {

class GCondition : public GGroup {
protected:
  explicit GCondition();

  /**
   * 计算需要返回第n个信息
   * 执行最后一个，返回-1即可。
   * 超出-1和size之间的范围，则不执行
   * @return
   */
  virtual CIndex choose() = 0;

  /**
   * 获取当前condition组内部元素的个数
   * @return
   */
  CSize getRange() const;

  CVoid dump(std::ostream &oss) final;

private:
  CStatus run() override;

  CStatus addElement(GElementPtr element) override;

  friend class GPipeline;
};

using GConditionPtr = GCondition *;

} // namespace burn